package com.vvv.designpattern.dprecated.state;

import com.vvv.designpattern.constants.RedisConstants;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Component;

import javax.annotation.Resource;
import java.util.concurrent.TimeUnit;

/**
 * @author vvv
 * @date 2023-11-20 10 48
 * discription
 * DeprecatedXXXOrder 是状态模式的具体状态类：
 * 不同的状态需要创建不同的具体状态类，本业务需要创建4个具体状态类，
 * 那么如果状态越多对应的具体状态类也越多，这会导致一定的类膨胀
 * 并且这些状态类要去实现父类对应的状态转换的方法
 *
 * DeprecatedXXXOrder 也是观察者模式的具体被观察角色
 */
@Component
public class DeprecatedCreateOrder extends DeprecatedAbstractOrderState {

    @Resource
    private RedisTemplate redisTemplate;

    @Override
    protected DeprecatedOrder createOrder(String orderId, String productId) {
        // 1. 根据orderId和productId创建订单对象，初始状态为ORDER_WAIT_PAY
        DeprecatedOrder order = DeprecatedOrder.builder()
                .orderId(orderId)
                .productId(productId)
                .state(ORDER_WAIT_PAY)
                .build();
        // 2. 将Order对象存入redis设置15分钟过期
        String key = RedisConstants.ORDER_STATE_KEY_PREFIX + orderId;
        redisTemplate.opsForValue().set(key, order, 900, TimeUnit.SECONDS);
        // 3. 观察者模式：发送订单创建Event
        super.notifyObserver(orderId, ORDER_WAIT_PAY);
        // 4. 返回
        return order;
    }
}
